package algorithm.poj.p3000;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLDecoder;
import java.util.Arrays;
import java.util.StringTokenizer;


/**
 * 分析：
 * 
 * 实现：
 * 
 * 经验和教训：
 * 
 * 
 * @author wong.tong@gmail.com
 *
 */
public class P3668 {

	public static void main(String[] args) throws Exception {

		InputStream input = null;
		if (false) {
			input = System.in;
		} else {
			URL url = P3668.class.getResource("P3668.txt");
			File file = new File(URLDecoder.decode(url.getPath(), "UTF-8"));
			input = new FileInputStream(file);
		}
		
		BufferedReader stdin = new BufferedReader(new InputStreamReader(input));

		String line = stdin.readLine();
		int N = Integer.valueOf(line);
		Point[] ps = new Point[N];
		int index = 0;
		Direction[] ds = new Direction[N*(N-1)/2];
		for (int i = 0; i < N; i ++) {
			StringTokenizer st = new StringTokenizer(stdin.readLine());
			ps[i] = new Point();
			ps[i].x = Integer.valueOf(st.nextToken());
			ps[i].y = Integer.valueOf(st.nextToken());
			for (int j = 0; j < i; j ++) {
				ds[index] = Direction.getInstance(ps[i], ps[j]);
				index ++;
			}
		}
		Arrays.sort(ds);
		
		int count = 1;
		Direction d = ds[0];
		for (int i = 1; i < ds.length; i ++) {
			if (ds[i].compareTo(d) != 0) {
				d = ds[i];
				count ++;
			}
		}
		System.out.println(count);
	}
	
	private static class Point {
		int x;
		int y;
	}
	
	private static class Direction implements Comparable<Direction> {
		int dx;
		int dy;
		
		public static Direction getInstance(Point p1, Point p2) {
			
			int dx = p1.x - p2.x;
			int dy = p1.y - p2.y;
			int d = gcd(dx, dy);
			if (d != 0) {
				dx /= d;
				dy /= d;
			}
			//一定要注意, dx, dy归一化时, dx=0是一个特殊情形
			if (dx == 0) {
				dy = 1;
			} else if (dx < 0) {
				dx = -dx;
				dy = -dy;
			}
			
			Direction dir = new Direction();
			dir.dx = dx;
			dir.dy = dy;
			return dir;
		}
		
		private static int gcd(int m, int n) {
			
			if (m < 0) m = -m;
			if (n < 0) n = -n;
			if (m < n) {
				int t = m;
				m = n;
				n = t;
			}
			if (n == 0) return m;
			else return gcd(n, m%n);
		}

		public int compareTo(Direction dir) {
			
			if (this.dx == dir.dx && this.dy == dir.dy) {
				return 0;
			} else if (this.dx > dir.dx || (this.dx == dir.dx && this.dy > dir.dy)) {
				return 1;
			} else {
				return -1;
			}
		}
	}
}